package com.gnerv.battle.boot.module.base.service.impl;

import com.gnerv.battle.boot.module.base.model.bo.RoleBO;
import com.gnerv.battle.boot.module.base.model.dto.RoleDTO;
import com.gnerv.battle.boot.module.base.model.entity.Role;
import com.gnerv.battle.boot.module.base.repository.mapper.RoleAccountMapper;
import com.gnerv.battle.boot.module.base.repository.mapper.RoleMapper;
import com.gnerv.battle.boot.module.base.repository.mapper.RolePermissionMapper;
import com.gnerv.battle.boot.module.base.repository.mapper.RoleViewMapper;
import com.gnerv.battle.boot.module.base.service.CurrentAccountService;
import com.gnerv.battle.boot.module.base.service.RoleService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;

/**
* @author Gnerv LiGen
*/
@Service
@AllArgsConstructor
public class RoleServiceImpl implements RoleService {

    private final RoleMapper roleMapper;
    private final RoleAccountMapper roleAccountMapper;
    private final RolePermissionMapper rolePermissionMapper;
    private final RoleViewMapper roleViewMapper;
    private final CurrentAccountService currentAccountService;

    @Override
    public boolean create(RoleBO roleBO) {
        Role role = roleBO.toCreateRole();
        role.setCreator(currentAccountService.accountUkId());
        roleMapper.insert(role);
        return true;
    }

    @Override
    public boolean deleteByUkId(String ukId) {
        roleMapper.deleteByUkId(ukId);
        roleAccountMapper.deleteByRoleUkId(ukId);
        rolePermissionMapper.deleteByRoleUkId(ukId);
        roleViewMapper.deleteByRoleUkId(ukId);
        return true;
    }

    @Override
    public boolean updateByUkId(RoleBO roleBO) {
        Role role = roleBO.toUpdateRole();
        roleMapper.updateByUkId(role);
        return true;
    }

    @Override
    public RoleDTO selectByUkId(String ukId) {
        return roleMapper.selectByUkId(ukId);
    }

    @Override
    public List<RoleDTO> listByName(String name) {
        return roleMapper.listByName(name);
    }

    @Override
    public List<String> listUkIdByAccountUkId(String accountUkId) {
        return roleMapper.listUkIdByAccountUkId(accountUkId);
    }

    @Override
    public boolean bindAccount(String roleUkId, Set<String> accountUkIdList) {
        roleAccountMapper.insertRoleAccount(roleUkId, accountUkIdList, currentAccountService.accountUkId());
        return true;
    }

    @Override
    public boolean bindPermission(String roleUkId, Set<String> permissionUkIdList) {
        rolePermissionMapper.insertRolePermission(roleUkId, permissionUkIdList, currentAccountService.accountUkId());
        return true;
    }

    @Override
    public boolean bindView(String roleUkId, Set<String> viewUkIdList) {
        roleViewMapper.insertRoleView(roleUkId, viewUkIdList, currentAccountService.accountUkId());
        return true;
    }

    @Override
    public boolean unbindAccount(String roleUkId) {
        roleAccountMapper.deleteByRoleUkId(roleUkId);
        return true;
    }

    @Override
    public boolean unbindPermission(String roleUkId) {
        rolePermissionMapper.deleteByRoleUkId(roleUkId);
        return true;
    }

    @Override
    public boolean unbindView(String roleUkId) {
        roleViewMapper.deleteByRoleUkId(roleUkId);
        return true;
    }
}




